package cn.mujiankeji.mbrowser.界面.标签页.书签

import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.combinedClickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Add
import androidx.compose.material.icons.filled.ArrowBack
import androidx.compose.material.icons.filled.Close
import androidx.compose.material.icons.filled.Delete
import androidx.compose.material.icons.filled.Edit
import androidx.compose.material.icons.filled.Search
import androidx.compose.material3.Card
import androidx.compose.material3.Checkbox
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.Divider
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.FloatingActionButton
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import cn.mujiankeji.mbrowser.数据.数据库.AppDatabase
import cn.mujiankeji.mbrowser.界面.图标.myiconpack.书签
import cn.mujiankeji.mbrowser.界面.图标.MyIconPack
import cn.mujiankeji.mbrowser.界面.图标.myiconpack.文件夹
import cn.mujiankeji.mbrowser.界面.标签页.统一标签页布局
import kotlinx.coroutines.flow.first
import org.koin.compose.koinInject

/**
 * 书签标签页实现
 */
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun 书签标签实现(state: 书签标签状态) {
    val db = koinInject<AppDatabase>()
    val bookmarkDao = db.书签()
    
    // 当前显示的书签和文件夹
    val 当前文件夹ID by state.当前文件夹ID
    val 文件夹列表 = bookmarkDao.获取指定文件夹下的子文件夹(当前文件夹ID).collectAsState(initial = emptyList())
    val 书签列表 = bookmarkDao.获取指定文件夹下的书签(当前文件夹ID).collectAsState(initial = emptyList())
    
    // 搜索结果
    val 是否搜索模式 by state.是否搜索模式
    val 搜索关键字 by state.搜索关键字
    val 搜索结果 = if (是否搜索模式){
        bookmarkDao.搜索书签(搜索关键字).collectAsState(initial = emptyList()).value
    }else null
    // 编辑模式
    val 是否编辑模式 by state.是否编辑模式
    val 选中条目ID列表 by state.选中条目ID列表
    
    // 面包屑导航路径
    val 当前路径 by state.当前路径

    统一标签页布局({state.标题.collectAsState().value?:""}){
        Column(modifier = Modifier.fillMaxSize()) {
            if (!是否搜索模式 && 当前路径.isNotEmpty()) {
                Row(
                    modifier = Modifier
                        .fillMaxWidth()
                        .padding(horizontal = 16.dp, vertical = 8.dp),
                    verticalAlignment = Alignment.CenterVertically
                ) {
                    // 显示"根目录"按钮
                    Text(
                        text = "根目录",
                        style = MaterialTheme.typography.bodyMedium,
                        color = MaterialTheme.colorScheme.primary,
                        modifier = Modifier.clickable {
                            state.当前文件夹ID.value = 0L
                            state.当前路径.value = emptyList()
                        }
                    )

                    // 显示路径
                    当前路径.forEachIndexed { index, bookmark ->
                        Text(" > ", color = MaterialTheme.colorScheme.onSurfaceVariant)
                        Text(
                            text = bookmark.标题,
                            style = MaterialTheme.typography.bodyMedium,
                            color = MaterialTheme.colorScheme.primary,
                            modifier = Modifier.clickable {
                                // 点击路径项导航到相应文件夹
                                state.当前文件夹ID.value = bookmark.id
                                state.当前路径.value = 当前路径.subList(0, index + 1)
                            }
                        )
                    }
                }

                Divider()
            }

            // 显示内容
            if (是否搜索模式) {
                搜索结果列表(
                    搜索结果 = 搜索结果 ?: emptyList(),
                    是否编辑模式 = 是否编辑模式,
                    选中条目ID列表 = 选中条目ID列表,
                    onItemClick = { bookmark ->
                        if (是否编辑模式) {
                            state.切换选择条目(bookmark.id)
                        } else if (bookmark.是否目录) {
                            state.进入文件夹(bookmark)
                        } else {
                            state.打开网页(bookmark.网址)
                        }
                    },
                    onItemLongClick = { bookmark ->
                        if (!是否编辑模式) {
                            state.切换编辑模式()
                            state.切换选择条目(bookmark.id)
                            true
                        } else {
                            false
                        }
                    }
                )
            }
            else {
                书签文件夹列表(
                    文件夹列表 = 文件夹列表.value,
                    书签列表 = 书签列表.value,
                    是否编辑模式 = 是否编辑模式,
                    选中条目ID列表 = 选中条目ID列表,
                    onFolderClick = { folder ->
                        if (是否编辑模式) {
                            state.切换选择条目(folder.id)
                        } else {
                            state.进入文件夹(folder)
                        }
                    },
                    onBookmarkClick = { bookmark ->
                        if (是否编辑模式) {
                            state.切换选择条目(bookmark.id)
                        } else {
                            state.打开网页(bookmark.网址)
                        }
                    },
                    onItemLongClick = { bookmark ->
                        if (!是否编辑模式) {
                            state.切换编辑模式()
                            state.切换选择条目(bookmark.id)
                            true
                        } else {
                            false
                        }
                    }
                )
            }
        }
    }
}

/**
 * 书签和文件夹列表
 */
@OptIn(ExperimentalFoundationApi::class)
@Composable
private fun 书签文件夹列表(
    文件夹列表: List<cn.mujiankeji.mbrowser.数据.数据库.DBBookmark>,
    书签列表: List<cn.mujiankeji.mbrowser.数据.数据库.DBBookmark>,
    是否编辑模式: Boolean,
    选中条目ID列表: Set<Long>,
    onFolderClick: (cn.mujiankeji.mbrowser.数据.数据库.DBBookmark) -> Unit,
    onBookmarkClick: (cn.mujiankeji.mbrowser.数据.数据库.DBBookmark) -> Unit,
    onItemLongClick: (cn.mujiankeji.mbrowser.数据.数据库.DBBookmark) -> Boolean
) {
    if (文件夹列表.isEmpty() && 书签列表.isEmpty()) {
        Box(
            modifier = Modifier.fillMaxSize(),
            contentAlignment = Alignment.Center
        ) {
            Text("此文件夹为空", color = MaterialTheme.colorScheme.onSurfaceVariant)
        }
        return
    }
    
    LazyColumn(
        modifier = Modifier.fillMaxSize()
    ) {
        // 文件夹部分
        if (文件夹列表.isNotEmpty()) {
            item {
                Text(
                    text = "文件夹",
                    style = MaterialTheme.typography.titleMedium,
                    modifier = Modifier.padding(16.dp)
                )
            }
            
            items(文件夹列表) { folder ->
                书签项目(
                    bookmark = folder,
                    是否文件夹 = true,
                    是否编辑模式 = 是否编辑模式,
                    是否选中 = 选中条目ID列表.contains(folder.id),
                    onClick = { onFolderClick(folder) },
                    onLongClick = { onItemLongClick(folder) }
                )
            }
        }
        
        // 书签部分
        if (书签列表.isNotEmpty()) {
            item {
                Text(
                    text = "书签",
                    style = MaterialTheme.typography.titleMedium,
                    modifier = Modifier.padding(16.dp)
                )
            }
            
            items(书签列表) { bookmark ->
                书签项目(
                    bookmark = bookmark,
                    是否文件夹 = false,
                    是否编辑模式 = 是否编辑模式,
                    是否选中 = 选中条目ID列表.contains(bookmark.id),
                    onClick = { onBookmarkClick(bookmark) },
                    onLongClick = { onItemLongClick(bookmark) }
                )
            }
        }
        
        // 底部空间，确保FAB不会挡住内容
        item { Spacer(modifier = Modifier.height(80.dp)) }
    }
}

/**
 * 搜索结果列表
 */
@OptIn(ExperimentalFoundationApi::class)
@Composable
private fun 搜索结果列表(
    搜索结果: List<cn.mujiankeji.mbrowser.数据.数据库.DBBookmark>,
    是否编辑模式: Boolean,
    选中条目ID列表: Set<Long>,
    onItemClick: (cn.mujiankeji.mbrowser.数据.数据库.DBBookmark) -> Unit,
    onItemLongClick: (cn.mujiankeji.mbrowser.数据.数据库.DBBookmark) -> Boolean
) {
    if (搜索结果.isEmpty()) {
        Box(
            modifier = Modifier.fillMaxSize(),
            contentAlignment = Alignment.Center
        ) {
            Text("未找到匹配的书签", color = MaterialTheme.colorScheme.onSurfaceVariant)
        }
        return
    }
    
    LazyColumn(
        modifier = Modifier.fillMaxSize()
    ) {
        items(搜索结果) { bookmark ->
            书签项目(
                bookmark = bookmark,
                是否文件夹 = bookmark.是否目录,
                是否编辑模式 = 是否编辑模式,
                是否选中 = 选中条目ID列表.contains(bookmark.id),
                onClick = { onItemClick(bookmark) },
                onLongClick = { onItemLongClick(bookmark) }
            )
        }
        
        // 底部空间
        item { Spacer(modifier = Modifier.height(16.dp)) }
    }
}

/**
 * 单个书签或文件夹项目
 */
@OptIn(ExperimentalFoundationApi::class)
@Composable
private fun 书签项目(
    bookmark: cn.mujiankeji.mbrowser.数据.数据库.DBBookmark,
    是否文件夹: Boolean,
    是否编辑模式: Boolean,
    是否选中: Boolean,
    onClick: () -> Unit,
    onLongClick: () -> Boolean
) {
    Card(
        modifier = Modifier
            .fillMaxWidth()
            .padding(horizontal = 16.dp, vertical = 4.dp)
            .combinedClickable(
                onClick = onClick,
                onLongClick = { onLongClick() }
            ),
        shape = RoundedCornerShape(8.dp)
    ) {
        Row(
            modifier = Modifier
                .fillMaxWidth()
                .padding(12.dp),
            verticalAlignment = Alignment.CenterVertically
        ) {
            // 选择框（仅在编辑模式下显示）
            if (是否编辑模式) {
                Checkbox(
                    checked = 是否选中,
                    onCheckedChange = { onClick() },
                    modifier = Modifier.padding(end = 8.dp)
                )
            }
            
            // 图标
            Box(
                modifier = Modifier
                    .size(40.dp)
                    .clip(CircleShape)
                    .background(MaterialTheme.colorScheme.primaryContainer),
                contentAlignment = Alignment.Center
            ) {
                if (是否文件夹) {
                    Icon(
                        MyIconPack.文件夹,
                        contentDescription = "文件夹",
                        tint = MaterialTheme.colorScheme.onPrimaryContainer
                    )
                } else {
                    Icon(
                        MyIconPack.书签,
                        contentDescription = "书签",
                        tint = MaterialTheme.colorScheme.onPrimaryContainer
                    )
                }
            }
            
            Spacer(modifier = Modifier.width(16.dp))
            
            // 标题和URL
            Column(
                modifier = Modifier.weight(1f)
            ) {
                Text(
                    text = bookmark.标题,
                    style = MaterialTheme.typography.bodyLarge,
                    fontWeight = FontWeight.Medium,
                    maxLines = 1,
                    overflow = TextOverflow.Ellipsis
                )
                
                if (!是否文件夹) {
                    Text(
                        text = bookmark.网址,
                        style = MaterialTheme.typography.bodyMedium,
                        color = MaterialTheme.colorScheme.onSurfaceVariant,
                        maxLines = 1,
                        overflow = TextOverflow.Ellipsis
                    )
                }
            }
        }
    }
} 